iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
AI/ ML & Data

菜就多練之我叫小賀逃離DS新手村系列 第 4

Day 4 嚴以律己-不監督也會學習

  • 分享至 

  • xImage
  •  

非監督式學習 (Unsupervised Learning) 🤖

非監督式學習指的是利用沒有標註正確答案的資料,找到它們彼此之間的模式與關係。針對不同的情境可以分為:
1. 聚類(Clustering)

  • 原理:將相似的資料透過分類的方式分成不同的組別,使同一個類別的資料具有相似的屬性從而發現資料之間的潛在關係。
  • 範例:客戶分群(Customer Segmentation)
  • 常見演算法:K-means

2. 關聯規則(Association Rule)

  • 原理:從資料集中尋找變量之間是否有特殊的關聯性。
  • 範例:購物籃分析(Basket Analysis)
  • 常見演算法:Apriori

3. 降維(Dimensionality Reduction)

  • 原理:通過使用較少的變量來表示高維度的資料(這裡的維度可以理解成資料的columns or variables),這些代表性變量可以有效抓取原始資料的大部分信息。降維的主要目的是減少計算上的複雜度,並提高模型的性能和可解釋性。
  • 常見演算法:主成分分析(Principal Components Analysis, PCA)

實戰演練 🔥

巴黎奧運正如火如荼的進行中,也感謝中華隊的運動員們為國爭光,今天我們進行一個與運動用品相關的實作。假設我們在一家運動用品店工作,老闆希望重新規劃商場的運動用品區域,以增加顧客的購買可能性。我們已經有顧客的消費記錄資料,透過這些資料,我們就可以進行購物籃分析,以觀察消費者在購買商品時,商品之間是否有關聯性。這將幫助我們了解哪些商品經常一起購買,進而優化商品的陳列,提高銷售額。

程式碼如下:

import numpy as np
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules

# 生成假資料
products = ['羽毛球拍', '籃球', '高爾夫球桿', '拳擊手套', '衝浪板', '空氣手槍', '排球']

np.random.seed(0)

data = [np.random.choice(products, np.random.randint(1, len(products)), replace=False) for _ in range(10000)]

df = pd.DataFrame(data)

# One-hot encoding
one_hot = pd.get_dummies(df.stack()).groupby(level=0).sum()

# 使用Apriori演算法進行購物籃分析
frequent_itemsets = apriori(one_hot, min_support=0.1, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)

# 輸出結果
print(frequent_itemsets)
print(rules)

Code Review 🧐

1. 資料生成

products = ['羽毛球拍', '籃球', '高爾夫球桿', '拳擊手套', '衝浪板', '空氣手槍', '排球']

np.random.seed(0)

data = [np.random.choice(products, np.random.randint(1, len(products)), replace=False) for _ in range(10000)]

df = pd.DataFrame(data)
  • 建立一個list用來儲存所有的商品項目
  • 使用 np.random.seed() 可以確保每次生成的資料是一樣的。
  • 使用 np.random.choice() 隨機選擇產品組合,生成10000筆資料,每筆資料的產品數量隨機分配

2. One-hot encoding

one_hot = pd.get_dummies(df.stack()).groupby(level=0).sum()
  • stack() 將資料做格式轉換,把每筆資料的產品項目展開成一列
  • 使用pd.get_dummies()將每筆資料的產品進行編碼(0:沒購買,1:有購買)
  • groupby(level=0).sum() 將每筆資料的產品編碼結果合併成一個One-hot列表

3. 使用Apriori演算法進行購物籃分析

frequent_itemsets = apriori(one_hot, min_support=0.1, use_colnames=True)
  • 透過apriori() 進行購物籃分析,最小支持度設定為0.1,即商品組合出現比例至少10%

4. 生成關聯規則

rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
  • 使用association_rules() 生成關聯規則,設定評估指標為lift,並將最小閾值設為1(lift值要大於等於1)

5. 輸出結果

print(frequent_itemsets)
print(rules)

建立的假資料如下:
https://ithelp.ithome.com.tw/upload/images/20240808/20155713rsZ8XHJBQk.jpg


One-hot encoding結果如下:
https://ithelp.ithome.com.tw/upload/images/20240808/20155713bBe6KFEDiH.jpg


Apriori演算法進行購物籃分析結果如下:
https://ithelp.ithome.com.tw/upload/images/20240808/20155713JIL6Z0N59k.jpg

  • support 表示每個itemsets在所有資料裡面出現頻率
  • 設定上只呈現頻率大於等於10%的商品組合

關聯規則如下:
https://ithelp.ithome.com.tw/upload/images/20240808/20155713qgSgSHh6Bg.jpg

  • confidence表示購買antecedents後有多少機率會購買consequents
  • lift 是用來衡量商品的相關性,lift值越高說明產品之間的相關性越強,1表示沒有相關;大於1正相關;小於1負相關
  • 設定上只會顯示lift值大於1的資料

總結 🔚

購物車分析適用於很多不同的情境,不管是電商還是實體商店都能透過這樣的關聯規則來做商業分析和策略規劃。


題外話 😂

今天放假沒有去上班,追了20集的「藍色監獄」,只能說劇情很好猜測但是裡面想傳達的概念可以套用在很多情境中(雖然這是一部足球動漫,但我完全把它套用在籃球情境上哈哈)。這周的目標是想找個寧靜的時間看完「青春18x2」,聽說風評很好,我個人十分期待哈哈。

今天是父親節(付清節)㊗️全天下的88們父親節快樂🎉


上一篇
Day 3 一生只督你一人-要被監督才肯學習
下一篇
Day 5 舉一反三-手標金標都有貼標
系列文
菜就多練之我叫小賀逃離DS新手村30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言